home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / glimpse-2.1 / agrep / delim.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-16  |  3.1 KB  |  96 lines

  1. /* Copyright (c) 1994 Burra Gopal, Udi Manber.  All Rights Reserved. */
  2.  
  3. #include "agrep.h"
  4. extern int EASYSEARCH, TCOMPRESSED;
  5.  
  6. /* Accesses src completely before dest, so that dest can be = src */
  7. preprocess_delimiter(src, srclen, dest, pdestlen)
  8.     unsigned char *src, *dest;
  9.     int    srclen, *pdestlen;
  10. {
  11.     CHAR temp[Maxline];
  12.     int i, j;
  13.  
  14.     strcpy(temp, src);
  15.     temp[srclen] = '\0';
  16.     for (i=0, j=0; i<srclen; i++) {
  17.         if (temp[i] == '\\') {
  18.             i++;
  19.             dest[j++] = temp[i];
  20.         }
  21.         if (temp[i] == '^') dest[j++] = '\n';
  22.         else if (temp[i] == '$') dest[j++] = '\n';
  23.         else dest[j++] = temp[i];
  24.     }
  25.     dest[j] = '\0';
  26.     *pdestlen = strlen(dest);
  27. }
  28.  
  29. /* Simple quadratic search for delimiters: from, to, delim, len: offset after begin where delimiter begins, -1 otherwise */
  30. int
  31. exists_delimiter(begin, end, delim, len)
  32.     unsigned char *begin, *end, *delim;
  33.     int len;
  34. {
  35.     register unsigned char    *curbegin, *curbuf, *curdelim;
  36.  
  37.     if (begin + len > end) return -1;
  38.     if (TCOMPRESSED == ON) return (exists_tcompressed_word(delim, len, begin, end - begin, EASYSEARCH));
  39.     for (curbegin = begin; curbegin + len <= end; curbegin ++) {
  40.         for (curbuf = curbegin, curdelim = delim; curbuf < curbegin + len; curbuf ++, curdelim++)
  41.             if (*curbuf != *curdelim) break;
  42.         if (curbuf >= curbegin + len) return (curbegin - begin);
  43.     }
  44.     return -1;
  45. }
  46.  
  47. /* return where delimiter begins or ends (=outtail): range = [begin, end) */
  48. unsigned char *
  49. forward_delimiter(begin, end, delim, len, outtail)
  50.     unsigned char *begin, *end, *delim;
  51.     int len, outtail;
  52. {
  53.     register unsigned char    *curbegin, *curbuf, *curdelim;
  54.  
  55.     if (begin + len > end) return end + 1;
  56.     if ((len == 1) && (*delim == '\n')) {
  57.         begin ++;
  58.         while ((begin < end) && (*begin != '\n')) begin ++;
  59.         if (outtail && (*begin == '\n')) begin++;
  60.         return begin;
  61.     }
  62.     if (TCOMPRESSED == ON) return forward_tcompressed_word(begin, end, delim, len, outtail, EASYSEARCH);
  63.     for (curbegin = begin; curbegin + len <= end; curbegin ++) {
  64.         for (curbuf = curbegin, curdelim = delim; curbuf < curbegin + len; curbuf ++, curdelim++)
  65.             if (*curbuf != *curdelim) break;
  66.         if (curbuf >= curbegin + len) break;
  67.     }
  68.     if (!outtail) return (curbegin <= end - len ? curbegin: end + 1);
  69.     else return (curbegin <= end - len ? curbegin + len : end + 1);
  70. }
  71.  
  72. /* return where the delimiter begins or ends (=outtail): range = [begin, end) */
  73. unsigned char *
  74. backward_delimiter(end, begin, delim, len, outtail)
  75.     unsigned char *end, *begin, *delim;
  76.     int len, outtail;
  77. {
  78.     register unsigned char    *curbegin, *curbuf, *curdelim;
  79.  
  80.     if (end - len < begin) return begin;
  81.     if ((len == 1) && (*delim == '\n')) {
  82.         end --;
  83.         while ((end > begin) && (*end != '\n')) end --;
  84.         if (outtail && (*end == '\n')) end++;
  85.         return end;
  86.     }
  87.     if (TCOMPRESSED == ON) return backward_tcompressed_word(end, begin, delim, len, outtail, EASYSEARCH);
  88.     for (curbegin = end-len; curbegin >= begin; curbegin --) {
  89.         for (curbuf = curbegin, curdelim = delim; curbuf < curbegin + len; curbuf ++, curdelim++)
  90.             if (*curbuf != *curdelim) break;
  91.         if (curbuf >= curbegin + len) break;
  92.     }
  93.     if (!outtail) return (curbegin >= begin ? curbegin : begin);
  94.     else return (curbegin >= begin ? curbegin + len : begin);
  95. }
  96.